package 课上练习0420_scala_method$$class

/**
 * 类的定义
 */
object Scala_02Class extends App {
  val p = new Person
  println(p.age)

  p.name = "zhangsan" //这里默认调用的set方法
}


/**
 * 1、在scala中，所有的属性默认都是私有的，private不需要自己写，当手动填写private后，字段和get/set方法都变成了private的了
 * 2、在scala中，get/set方法都是自动生成的
 */
class Person {
  // 直接给name赋值bing，如果不指定类型，默认进行类型推断
  var name = "bing"
  // 如果默认值是null或者占位符_，必须指定类型，否则就成了Null类型，在使用时会报错
  var name1: String = null
  var name2: String = _
  /*
  区别val和var
  1、var的变量会自动生成getter和setter，val的变量只能生成getter
  2、val类型的字段不能使用占位符
   */
  val age = 10

  // 1、测试手动添加private时的访问情况，因为属性和get/set都变成private了，外界无法调用;
  // 2、伴生对象可以调用
  private var height = 10
  // 3、加上[this]后，伴生对象都无法访问了，只能在Person内部使用this访问，连其他的person对象也不能访问
  private [Person] var weight = 100

  // 扩展，作用域保护，中括号中表示访问权限最多到那个类，可以使包、类、单例对象
//  private [Scala_02Class] var weight1 = 100

  def fieldAccessTest(p: Person): Unit = {
    name1 = "1"
    weight = 1
//    p.weight = 1 无法访问
//    p.weight1 = 100
  }
}

// 伴生对象
object Person {
  val p = new Person
  p.height = 10
}
